Hướng dẫn Send EMail trong Laravel 9 với đầy đủ demo
 
                                                                Các bước dưới đây sẽ giúp các bạn tạo 1 app đơn giản để gửi mail từ localhost với laravel 9
- Tạo ứng dụng laravel 9
- Cấu hình file .env smtp google
- Tạo mail class
- Tạo router send Email
- Tạo controller và view blade
- Tạo Job Send Email
- Chạy chương trình
1 Tạo ứng dụng Laravel 9
Tạo ứng dụng laravel 9 với command sau :
composer create-project --prefer-dist laravel/laravel laemail
2 Cấu hình .env smtp google
MAIL_MAILER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=hienlashare.info@gmail.com
MAIL_PASSWORD=qvnlxhqrcoeybj**
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS="hello@example.com"
MAIL_FROM_NAME="${APP_NAME}"
3 Tạo mail class
Chúng ta dùng lệnh sau :
php artisan make:mail DemoEmail
Và code như sau ở file app/Mail/DemoEmail.php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
class DemoEmail extends Mailable
{
    use Queueable, SerializesModels;
    /**
     * Create a new message instance.
     *
     * @return void
     */
    protected $data;
    public function __construct($data)
    {
        $this->data = $data;
    }
    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        $data = $this->data;
        return $this->view('email.demo',compact('data'));
    }
}
Tạo blade mail resources/views/email/demo.blade.php
<h2>{{$data['title']}}</h2>
<div>
    <h3>{{$data['content']}}</h3>
</div>
4 Tạo router send Email
Ở router chúng ta thêm 2 router như sau :routes/web.php
Route::get('email',[\App\Http\Controllers\DemoController::class,'index'])->name('email');
Route::post('email',[\App\Http\Controllers\DemoController::class,'sendmail'])->name('sendmail');
5 Tạo controller và view blade
Tại Controller app/Http/Controllers/DemoController.php :
namespace App\Http\Controllers;
use App\Mail\DemoEmail;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;
class DemoController extends Controller
{
    public function index()
    {
        return view('email');
    }
    public function sendmail(Request $request)
    {
        $data['title'] ='Demo Email';
        $data['content'] = 'Đây là test';
        //Mail::to($request->email)->send(new DemoEmail($data));
        \App\Jobs\DemoEmail::dispatch($data,$request->email)->delay(now()->addSeconds(5));
        return redirect(route('email'))->with(['msg'=>'Đã gửi email thành công']);
    }
}
Tạo blade email.blade.php
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.3.1/dist/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.3.1/dist/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
<div class="container">
    @if(\Illuminate\Support\Facades\Session::has('msg'))
    <div class="alert alert-primary" role="alert">
        {{ \Illuminate\Support\Facades\Session::get('msg')  }}
    </div>
    @endif
<form method="post" action="{{route('sendmail')}}">
    @csrf
    <div class="form-group">
        <label for="exampleInputEmail1">Email address</label>
        <input name="email" type="email" class="form-control" id="exampleInputEmail1" aria-describedby="emailHelp" placeholder="Enter email">
    </div>
    <button type="submit" class="btn btn-primary">Test Send Email</button>
</form>
</div>
6 Tạo Job Send Email
Tạo job với lệnh sau :
php artisan make:job DemoEmail
Ở file app/Jobs/DemoEmail.php
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Mail;
class DemoEmail implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
    /**
     * Create a new job instance.
     *
     * @return void
     */
    protected $data;
    protected $email;
    public function __construct($data,$email)
    {
        $this->data = $data;
        $this->email = $email;
    }
    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        Mail::to($this->email)->send(new \App\Mail\DemoEmail($this->data));
    }
}
7 Chạy chương trình
Chúng ta chạy lệnh
php artisan serve
Sau đó truy cập link : http://127.0.0.1:8000/email
 
                 
                 
                